﻿using System;
using System.Collections.Generic;
using System.Threading;
using System.Diagnostics;
using System.Text;

namespace Vit.Common.Helpers
{
    public class DosHelper
    {
        /// <summary>
        /// 执行DOS命令，返回DOS命令的输出
        /// </summary>
        /// <param name="dosCommand">dos命令</param>
        /// <param name="milliseconds">等待命令执行的时间（单位：毫秒），如果设定为0，则无限等待</param>
        /// <returns>返回输出，如果发生异常，返回空字符串</returns>
        public static string ExecuteCommand(string dosCommand, int milliseconds)
        {
            return ExecuteCommand("cmd.exe", "/C " + dosCommand, milliseconds);
        }

        public static string ExecuteCommand(string command, string argument, int milliseconds)
        {
            string output = ""; //输出字符串
            Process process = new Process(); //创建进程对象
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = command; //设定需要执行的命令
            startInfo.Arguments = argument; //设定参数，其中的“/C”表示执行完命令后马上退出
            startInfo.UseShellExecute = false; //不使用系统外壳程序启动
            startInfo.RedirectStandardInput = false; //不重定向输入
            startInfo.RedirectStandardOutput = true; //重定向输出
            startInfo.CreateNoWindow = true; //不创建窗口
            process.StartInfo = startInfo;

            try
            {
                if (process.Start()) //开始进程
                {
                    if (milliseconds <= 0)
                        process.WaitForExit(); //这里无限等待进程结束
                    else
                        process.WaitForExit(milliseconds); //这里等待进程结束，等待时间为指定的毫秒
                    output = process.StandardOutput.ReadToEnd();//读取进程的输出
                }
            }
            catch
            {
            }
            finally
            {
                if (process != null)
                    process.Close();
            }

            return output;
        }

        public class IISCommand
        {
            public static string CreateWebSiteCommand(string siteName, string siteIP, string sitePort, string hostHeader, string siteRoot, bool autoStart)
            {
                return CreateWebSiteCommand(null, null, null, siteName, siteIP, sitePort, hostHeader, siteRoot, autoStart);
            }

            public static string CreateWebSiteCommand(string server, string userName, string password, string siteName, string siteIP, string sitePort, string hostHeader, string siteRoot, bool autoStart)
            {
                if (!string.IsNullOrEmpty(server))
                {
                    return string.Format("iisweb /s {0} /u {1} /p {2} /create \"{3}\" \"{4}\"{5}{6}{7}{8}",
                        server, userName, password,
                        siteRoot, siteName,
                        string.IsNullOrEmpty(hostHeader) ? "" : string.Format(" /d {0}", hostHeader),
                        string.IsNullOrEmpty(siteIP) ? "" : string.Format(" /i {0}", siteIP),
                        string.IsNullOrEmpty(sitePort) ? "" : string.Format(" /b {0}", sitePort),
                        autoStart ? "" : " /dontstart");
                }
                else
                {
                    return string.Format("iisweb /create \"{0}\" \"{1}\"{2}{3}{4}{5}",
                            siteRoot, siteName,
                            string.IsNullOrEmpty(hostHeader) ? "" : string.Format(" /d {0}", hostHeader),
                            string.IsNullOrEmpty(siteIP) ? "" : string.Format(" /i {0}", siteIP),
                            string.IsNullOrEmpty(sitePort) ? "" : string.Format(" /b {0}", sitePort),
                            autoStart ? "" : " /dontstart");
                }
            }

            public static string StartWebSiteCommand(string siteName)
            {
                return StartWebSiteCommand(null, null, null, siteName);
            }

            public static string StartWebSiteCommand(string server, string userName, string password, string siteName)
            {
                if (!string.IsNullOrEmpty(server))
                {
                    return string.Format("iisweb /s {0} /u {1} /p {2} /start \"{4}\"",
                        server, userName, password, siteName);
                }
                else
                {
                    return string.Format("iisweb /start \"{0}\"", siteName);
                }
            }

            public static string StopWebSiteCommand(string siteName)
            {
                return StopWebSiteCommand(null, null, null, siteName);
            }

            public static string StopWebSiteCommand(string server, string userName, string password, string siteName)
            {
                if (!string.IsNullOrEmpty(server))
                {
                    return string.Format("iisweb /s {0} /u {1} /p {2} /stop \"{4}\"",
                        server, userName, password, siteName);
                }
                else
                {
                    return string.Format("iisweb /stop \"{0}\"", siteName);
                }
            }

            public static string PauseWebSiteCommand(string siteName)
            {
                return PauseWebSiteCommand(null, null, null, siteName);
            }

            public static string PauseWebSiteCommand(string server, string userName, string password, string siteName)
            {
                if (!string.IsNullOrEmpty(server))
                {
                    return string.Format("iisweb /s {0} /u {1} /p {2} /pause \"{4}\"",
                        server, userName, password, siteName);
                }
                else
                {
                    return string.Format("iisweb /pause \"{0}\"", siteName);
                }
            }

            public static string DeleteWebSiteCommand(string siteName)
            {
                return DeleteWebSiteCommand(null, null, null, siteName);
            }

            public static string DeleteWebSiteCommand(string server, string userName, string password, string siteName)
            {
                if (!string.IsNullOrEmpty(server))
                {
                    return string.Format("iisweb /s {0} /u {1} /p {2} /delete \"{4}\"",
                        server, userName, password, siteName);
                }
                else
                {
                    return string.Format("iisweb /delete \"{0}\"", siteName);
                }
            }

            public static string QueryWebSiteCommand()
            {
                return QueryWebSiteCommand(null, null, null, null);
            }

            public static string QueryWebSiteCommand(string server, string userName, string password)
            {
                return QueryWebSiteCommand(server, userName, password, null);
            }

            public static string QueryWebSiteCommand(string siteName)
            {
                return QueryWebSiteCommand(null, null, null, siteName);
            }

            public static string QueryWebSiteCommand(string server, string userName, string password, string siteName)
            {
                if (!string.IsNullOrEmpty(server))
                {
                    return string.Format("iisweb /s {0} /u {1} /p {2} /query{3}",
                        server, userName, password,
                        string.IsNullOrEmpty(siteName) ? "" : string.Format(" \"{0}\"", siteName));
                }
                else
                {
                    return string.Format("iisweb /query{0}", 
                        string.IsNullOrEmpty(siteName) ? "" : string.Format(" \"{0}\"", siteName));
                }
            }
        }
    }
}
